<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
    <th:block th:include="include :: header('课题结项修改')" />
    <th:block th:include="include :: datetimepicker-css" />
    <th:block th:include="include :: bootstrap-fileinput-css"/>
    <th:block th:include="include :: select2-css" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
    <form class="form-horizontal m" id="form-apply-edit" th:object="${sciHorizontalApply}">

        <input name="id" id="ktid" th:field="*{id}" type="hidden">

        <input name="state" id="state" th:field="*{state}" type="hidden">

        <h4 class="form-header h4">基本信息</h4>
        <div class="row">
            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">申请人：</label>
                    <div class="col-sm-8">
                        <select name="userId" class="form-control m-b" disabled="true">
                            <option th:each="user : ${sysUsers1}" th:text="${user.userName}" th:value="${user.userId}" th:selected="${ user.userId == sciHorizontalApply.userId}"></option>
                        </select>
                    </div>
                </div>
            </div>
            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">课题编号：</label>
                    <div class="col-sm-8">
                        <input   th:field="*{topNumber}" class="form-control" type="text" maxlength="20">
                    </div>
                </div>
            </div>
            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">课题类型：</label>
                    <div class="col-sm-8">
                        <select name="topType" class="form-control" th:with="type=${@dict.getType('sci_top_type')}" required>
                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{topType}"></option>
                        </select>
                    </div>
                </div>
            </div>
            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">课题名称：</label>
                    <div class="col-sm-8">
                        <input name="topName" th:field="*{topName}" class="form-control" type="text" required maxlength="50">
                    </div>
                </div>
            </div>
            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">项目金额：</label>
                    <div class="col-sm-8">
                        <input name="amount" th:field="*{amount}" class="form-control" type="number" required readonly step="0.0001" maxlength="9">
                    </div>
                </div>
            </div>


            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">结项日期：</label>
                    <div class="col-sm-8">
                        <div class="input-group date">
                            <input  autocomplete="off" name="validityDate" th:field="*{validityDate}" th:value="${#dates.format(validityDate, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text" required>
                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">主持人：</label>
                    <div class="col-sm-8">
                        <select id="firstPersonSelect" name="firstPersonId_disabled" class="form-control m-b" required disabled="true">
                            <option value="">无</option>
                            <option th:each="user : ${sysUsers1}" th:text="${user.userName}" th:value="${user.userId}" th:selected="${ #strings.toString(user.userId) == sciHorizontalApply.firstPersonId}"></option>
                        </select>
                        <input type="hidden" name="firstPersonId" th:value="*{firstPersonId}">
                    </div>
                </div>
            </div>

            <div class="col-xs-6">

                <div class="form-group">

                    <label class="col-sm-4 control-label is-required">成员1：</label>

                    <div class="col-sm-8">

                        <select id="member1Select" name="secondPersonId" class="form-control m-b" onchange="updateMemberLists()" >

                            <option value="">无</option>

                            <option th:each="user : ${sysUsers1}" th:text="${user.userName}" th:value="${user.userId}" th:selected="${ #strings.toString(user.userId) == sciHorizontalApply.secondPersonId}" ></option>

                        </select>

                    </div>

                </div>

            </div>



            <div class="col-xs-6">

                <div class="form-group">

                    <label class="col-sm-4 control-label is-required">成员2：</label>

                    <div class="col-sm-8">

                        <select id="member2Select" name="thirdPersonId" class="form-control m-b" onchange="updateMemberLists()" >

                            <option value="">无</option>

                            <option th:each="user : ${sysUsers1}" th:text="${user.userName}" th:value="${user.userId}" th:selected="${ #strings.toString(user.userId) == sciHorizontalApply.thirdPersonId}"  ></option>

                        </select>

                    </div>

                </div>

            </div>



            <div class="col-xs-6">

                <div class="form-group">

                    <label class="col-sm-4 control-label is-required">成员3：</label>

                    <div class="col-sm-8">

                        <select id="member3Select" name="fourthPersonId" class="form-control m-b" onchange="updateMemberLists()" >

                            <option value="">无</option>

                            <option th:each="user : ${sysUsers1}" th:text="${user.userName}" th:value="${user.userId}" th:selected="${ #strings.toString(user.userId) == sciHorizontalApply.fourthPersonId}"  ></option>

                        </select>

                    </div>

                </div>

            </div>



            <!-- 第5位及以后：可动态添加与编辑 -->

            <div class="col-xs-12">

                <div class="form-group">

                    <label class="col-sm-2 control-label">更多成员：</label>

                    <div class="col-sm-10">

                        <div id="memberContainer" class="row" th:data-extra-members="${extraMembers}"></div>

                        <button type="button" id="addMemberBtn" class="btn btn-white btn-sm" title="新增成员">

                            <a href="#"><i class="fa fa-plus-circle" ></i>增加成员</a>

                        </button>

                    </div>

                </div>

            </div>


            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">结题合同：</label>
                    <div class="col-sm-8">
                        <input type="hidden" name="filingurl" th:field="*{filingurl}">
                        <div class="file-loading">
                            <input class="form-control file-uploada" id="filingurl" name="file" type="file">
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-xs-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label is-required">结题备案表：</label>
                    <div class="col-sm-8">
                        <input type="hidden" name="agreeurl" th:field="*{agreeurl}">
                        <div class="file-loading">
                            <input class="form-control file-uploadb" id="agreeurl" name="file" type="file">
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <h4 class="form-header h4"> 批阅记录</h4>
        <div class="row">
            <div class="col-sm-12">
                <div class="form-group">
                    <table id="bootstrap-table"></table>
                </div>
            </div>
        </div>
    </form>
</div>
<div class="row">
    <div class="col-sm-offset-5 col-sm-10">
        <button type="button" class="btn btn-sm btn-primary" onclick="submitHandler()">    保 存</button>&nbsp;
        <button type="button" class="btn btn-sm btn-danger" onclick="closeItem()"> 关 闭 </button>
    </div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<th:block th:include="include :: bootstrap-fileinput-js"/>
<th:block th:include="include :: select2-js" />

<script type="text/javascript">

/**
 * overedit 其他成员动态编辑与检索
 * - 预渲染 extraMembers（第5位及以后）
 * - 点击 + 新增一项；点击 - 移除一项
 * - 所有下拉启用 Select2 输入检索
 * - 实现下拉框联动，防止重复选择成员
 */
(function($){

    // 追加一项成员下拉

    function appendMemberSelect(selectedVal) {

        // 获取原始选项数据

        var originalOptions = $('#member1Select').data('original-options');

        var memberCount = $('.member-item').length + 1; // 计算当前成员数量

        var memberId = 'dynamicMember' + memberCount; // 为每个动态成员生成唯一ID



        var $tpl = $('<div class="col-xs-3 m-b-xs member-item">\
            <div class="input-group">\
                <select id="' + memberId + '" name="members" class="form-control m-b member-select select2-select" onchange="updateMemberLists()"></select>\
                <span class="input-group-btn">\
                    <button class="btn btn-danger btn-sm remove-member" type="button" title="移除"></button>\
                </span>\
            </div>\
        </div>');



        var $select = $tpl.find('select.member-select');



        // 添加默认选项和原始选项

        $select.html('<option value="">无</option>' + originalOptions);



        $('#memberContainer').append($tpl);



        // 如果有选中的值，先设置选中值

        if (selectedVal) {

            $select.val(String(selectedVal));

        }



        // 初始化新添加的下拉框选项

        updateDynamicMemberList($select[0]);



        // 初始化Select2，支持输入检索

        $select.select2({

            width: '100%',

            placeholder: '输入检索成员',

            allowClear: true

        });



        // 如果有选中的值，触发change事件

        if (selectedVal) {

            $select.trigger('change');

        }

    }



    $(function(){

        // 页面加载完成后保存原始选项并初始化联动
        
        // 保存主持人下拉框的原始选项（虽然不可编辑，但需要用于联动）
        var firstPersonOriginalOptions = $('#firstPersonSelect').html();
        $('#firstPersonSelect').data('original-options', firstPersonOriginalOptions);
        
        // 保存其他成员下拉框的原始选项
        $('#member1Select, #member2Select, #member3Select').each(function() {

            var originalOptions = $(this).html();

            $(this).data('original-options', originalOptions);

        });

        



        // 初始化前四位下拉的检索体验（第二/第三/第四）

        $('select[name="secondPersonId"], select[name="thirdPersonId"], select[name="fourthPersonId"]').each(function(){

            $(this).select2({

                width: '100%',

                placeholder: '输入检索成员',

                allowClear: true

            });

        });

        



        // 预渲染已有的第5位及以后成员（在保存原始选项之后）

        setTimeout(function() {

            // 先清空已有的成员项目，避免重复添加

            $('#memberContainer').empty();

            



            var extraMembers = $('#memberContainer').data('extra-members');

            if (Array.isArray(extraMembers)) {

                extraMembers.forEach(function(mid){ appendMemberSelect(mid); });

            } else if (extraMembers) {

                try {

                    var arr = JSON.parse(extraMembers);

                    if (Array.isArray(arr)) arr.forEach(function(mid){ appendMemberSelect(mid); });

                } catch(e) {}

            }

        }, 50);

        



        // 初始化联动效果

        updateMemberLists();

        



        // 初始化Select2组件以支持搜索功能

        $('#member1Select, #member2Select, #member3Select').select2({

            placeholder: "无",

            allowClear: true,

            width: "100%"

        });
        
        // 为主持人下拉框初始化Select2（虽然不可编辑，但可以改善显示效果）
        $('#firstPersonSelect').select2({
            placeholder: "无",
            allowClear: true,
            width: "100%"
        });





        // 页面加载完成后，更新所有动态成员的选项

        setTimeout(function() {

            updateMemberLists();

        }, 100);





        // 新增/移除

        $('#addMemberBtn').on('click', function(){

            appendMemberSelect(null);

        });

        $(document).on('click', '.remove-member', function(){

            $(this).closest('.member-item').remove();

            // 移除成员后更新联动

            updateMemberLists();

        });

    });

})(jQuery);





// 更新成员下拉框列表

function updateMemberLists() {

    // 获取所有已选中的成员ID（使用Set自动去重）

    var selectedIds = new Set();
    
    // 获取主持人下拉框的值（虽然不可编辑，但仍需参与联动）
    var firstPersonValue = $('#firstPersonSelect').val();


    // 获取三个固定成员下拉框的值

    var member1Value = $('#member1Select').val();

    var member2Value = $('#member2Select').val();

    var member3Value = $('#member3Select').val();


    // 将非空值添加到Set中
    if (firstPersonValue) selectedIds.add(firstPersonValue);
    if (member1Value) selectedIds.add(member1Value);
    if (member2Value) selectedIds.add(member2Value);
    if (member3Value) selectedIds.add(member3Value);


    // 添加动态成员的选中值

    $('.member-select').each(function() {

        var value = $(this).val();

        if (value) {

            selectedIds.add(value);

        }

    });

    



    // 为每个固定下拉框更新选项（不包括主持人，因为主持人下拉框不可编辑）

    updateSelectOptions('#member1Select', member1Value, selectedIds);

    updateSelectOptions('#member2Select', member2Value, selectedIds);

    updateSelectOptions('#member3Select', member3Value, selectedIds);

    



    // 为每个动态下拉框更新选项

    $('.member-select').each(function() {

        updateDynamicSelectOptions($(this), $(this).val(), selectedIds);

    });


}





// 更新单个下拉框的选项

function updateSelectOptions(selectId, currentValue, selectedIds) {

    var selectElement = $(selectId);

    var originalOptions = selectElement.data('original-options');

    var isCurrentlySelected = selectElement.val(); // 保存当前选中的值

    



    // 清空当前选项（保留第一个提示选项）

    selectElement.find('option:not(:first)').remove();

    



    // 解析原始选项

    var tempDiv = $('<div>' + originalOptions + '</div>');

    var hasBlankOption = false; // 标记是否已添加空选项

    



    tempDiv.find('option').each(function() {

        var option = $(this);

        var value = option.val();

        



        // 只有当选项值为空（请选择）或未被其他下拉框选中时才添加

        // currentValue（当前下拉框已选中的值）总是会被保留，如果它不在其他下拉框中

        if (value === "" && !hasBlankOption) {

            // 只添加一次空选项

            selectElement.append(option.clone());

            hasBlankOption = true;

        } else if (value !== "" && (!selectedIds.has(value) || value === currentValue || value === "-1")) {

            // 添加非空选项，如果它未被其他下拉框选中，或者是当前下拉框已选中的值，或者userId为-1（其他）

            selectElement.append(option.clone());

        }

    });

    



    // 重新设置选中状态，确保选中的值仍然被选中

    if (isCurrentlySelected) {

        selectElement.val(isCurrentlySelected);

    }


}





// 更新动态添加的成员下拉框

function updateDynamicMemberList(element) {

    var selectElement = $(element);

    var currentValue = selectElement.val();

    var allSelectedIds = getSelectedIds();

    



    // 为动态成员下拉框更新选项

    updateDynamicSelectOptions(selectElement, currentValue, allSelectedIds);


}





// 获取所有已选中的ID（包括固定成员和动态成员）

function getSelectedIds() {

    var selectedIds = new Set();
    
    // 添加主持人下拉框的选中值（虽然不可编辑，但仍需参与联动）
    var firstPersonValue = $('#firstPersonSelect').val();


    // 添加固定成员的选中值

    var member1Value = $('#member1Select').val();

    var member2Value = $('#member2Select').val();

    var member3Value = $('#member3Select').val();
    
    // 将主持人下拉框的值也加入到集合中
    if (firstPersonValue) selectedIds.add(firstPersonValue);
    if (member1Value) selectedIds.add(member1Value);
    if (member2Value) selectedIds.add(member2Value);
    if (member3Value) selectedIds.add(member3Value);


    // 添加动态成员的选中值

    $('.member-select').each(function() {

        var value = $(this).val();

        if (value) {

            selectedIds.add(value);

        }

    });

    



    return selectedIds;


}





// 更新动态下拉框的选项

function updateDynamicSelectOptions(selectElement, currentValue, selectedIds) {

    var originalOptions = $('#member1Select').data('original-options');

    var isCurrentlySelected = selectElement.val(); // 保存当前选中的值

    



    // 清空当前选项（保留第一个提示选项）

    selectElement.find('option:not(:first)').remove();

    



    // 解析原始选项

    var tempDiv = $('<div>' + originalOptions + '</div>');

    var hasBlankOption = false; // 标记是否已添加空选项

    



    tempDiv.find('option').each(function() {

        var option = $(this);

        var value = option.val();

        



        // 只有当选项值为空（请选择）或未被其他下拉框选中时才添加

        // currentValue（当前下拉框已选中的值）总是会被保留，如果它不在其他下拉框中

        if (value === "" && !hasBlankOption) {

            // 只添加一次空选项

            selectElement.append(option.clone());

            hasBlankOption = true;

        } else if (value !== "" && (!selectedIds.has(value) || value === currentValue || value === "-1")) {

            // 添加非空选项，如果它未被其他下拉框选中，或者是当前下拉框已选中的值，或者userId为-1（其他）

            selectElement.append(option.clone());

        }

    });

    



    // 重新设置选中状态，确保选中的值仍然被选中

    if (isCurrentlySelected) {

        selectElement.val(isCurrentlySelected);

    }


}

</script>
<script type="text/javascript">
    $(function(){
        <!-- laydate示例 -->
        layui.use('laydate', function(){
            var laydate = layui.laydate;
            laydate.render({
                elem: '#laydate-demo-4',
                range: true
            });
            var startDate = laydate.render({
                elem: '#laydate-startTime',
                max: $('#laydate-endTime').val(),
                theme: 'molv',
                trigger: 'click',
                done: function(value, date) {
                    // 结束时间大于开始时间
                    if (value !== '') {
                        endDate.config.min.year = date.year;
                        endDate.config.min.month = date.month - 1;
                        endDate.config.min.date = date.date;
                    } else {
                        endDate.config.min.year = '';
                        endDate.config.min.month = '';
                        endDate.config.min.date = '';
                    }
                }
            });
            var endDate = laydate.render({
                elem: '#laydate-endTime',
                min: $('#laydate-startTime').val(),
                theme: 'molv',
                trigger: 'click',
                done: function(value, date) {
                    // 开始时间小于结束时间
                    if (value !== '') {
                        startDate.config.max.year = date.year;
                        startDate.config.max.month = date.month - 1;
                        startDate.config.max.date = date.date;
                    } else {
                        startDate.config.max.year = '';
                        startDate.config.max.month = '';
                        startDate.config.max.date = '';
                    }
                }
            });
        });

        var kid = $("#ktid").val();
        var options = {
            url: prefix + "/bhyy/"+kid,
            showSearch: false,
            showRefresh: false,
            showToggle: false,
            showColumns: false,
            pagination:false,

            columns: [

                {
                    field : 'createTime',
                    title : '批阅时间',
                    width: 200

                } ,
                {
                    field : 'uname',
                    title : '批阅人',
                    width: 100
                },
                {
                    field : 'concate',
                    title : '内容',
                    width: 500
                },
                {
                    field : 'state',
                    title : '审核状态',
                    width: 100
                }
                //
                // {
                //     field: 'status',
                //     title: '批阅状态',
                //     align: 'center',
                //     formatter: function(value, row, index) {
                //         return $.table.selectDictLabel(datas, value);
                //     }
                // }
            ]
        };
        $.table.init(options);
    });
</script>
<script th:inline="javascript">
    var prefix = ctx + "system/apply";
    $("#form-apply-edit").validate({
        focusCleanup: true
    });

    $("input[name='amount']").on('input', function() {
        var value = $(this).val();
        // 限制整数部分不超过9位
        if (value) {
            var numericValue = parseFloat(value);
            // 限制整数部分长度
            if (value.indexOf('.') !== -1) {
                var parts = value.split('.');
                if (parts[0].length > 9) {
                    $(this).val(parts[0].substring(0, 9) + (parts[1] ? '.' + parts[1] : ''));
                }
            } else {
                if (value.length > 9) {
                    $(this).val(value.substring(0, 9));
                }
            }
            // 限制小数点后只能输入四位
            if (value.indexOf('.') !== -1) {
                var parts = value.split('.');
                if (parts[1] && parts[1].length > 4) {
                    $(this).val(parts[0] + '.' + parts[1].substring(0, 4));
                }
            }
            // 限制最大值
            var valueStr = numericValue.toString();
            if (valueStr.length > 9){
                this.value = "";
                $.modal.alertError("输入金额有误差：总长度最大9位数，小数点后最大四位；例：9999.9999")
            }
        }
    });

    function submitHandler() {
        if ($.validate.form()) {
            // 校验项目金额不能为负数
            var projectAmount = $("input[name='amount']").val();
            if (parseFloat(projectAmount) <= 0) {
                return $.modal.alertError("请输入有效的项目金额");
            }
            // 校验项目金额小数点后最多4位
            if (!/^\d+(\.\d{1,4})?$/.test(projectAmount)) {
                return $.modal.alertError("项目金额小数点后最多4位");
            }
            $.operate.saveTab(prefix + "/overedit", $('#form-apply-edit').serialize());
        }
    }

    $("input[name='validityDate']").datetimepicker({
        format: "yyyy-mm-dd",
        minView: "month",
        autoclose: true
    });



    $(".file-uploada").each(function (i) {
        var val = $("input[name='" + this.id + "']").val()
        var initialPreview = [];
        var initialPreviewConfig = [];
        
        if (val && val.trim() !== '') {
            initialPreview = [val];
            initialPreviewConfig = [{
                type: "pdf",
                caption: val.split('/').pop(),
                url: ctx + "common/delete",
                key: val
            }];
        }
        
        $(this).fileinput({
            'uploadUrl': ctx + 'common/upload/hxkt',
            initialPreviewAsData: true,
            initialPreview: initialPreview,
            initialPreviewConfig: initialPreviewConfig,
            maxFileCount: 1,
        maxFileSize: 51200,
            autoReplace: true,
            overwriteInitial: true,
            allowedFileExtensions: ["pdf"],
            slugCallback: function(filename) {
                if ($("input[name='topName']").val()===""){
                    $(".file-uploada").fileinput('clear');
                    $.modal.alertError("请先输入课题名称");
                    return false;
                }
                // 自定义文件名生成规则
                fileExtension = filename.split('.').pop();
                const year = new Date().getFullYear();
                const newName = year +"-"+ $("input[name='topName']").val() +"-"+ "结项合同"+ "." + fileExtension;
                return newName;
            },
        }).on('fileuploaded', function (event, data, previewId, index) {
            if (data.response && data.response.url) {
                $("input[name='" + event.currentTarget.id + "']").val(data.response.url);
            }
        }).on('fileremoved', function (event, id, index) {
            $("input[name='" + event.currentTarget.id + "']").val('');
        }).on('fileclear', function (event) {
            $("input[name='" + event.currentTarget.id + "']").val('');
        });
    });
    $(".file-uploadb").each(function (i) {
        var val = $("input[name='" + this.id + "']").val()
        var initialPreview = [];
        var initialPreviewConfig = [];
        
        if (val && val.trim() !== '') {
            initialPreview = [val];
            initialPreviewConfig = [{
                type: "pdf",
                caption: val.split('/').pop(),
                url: ctx + "common/delete",
                key: val
            }];
        }
        
        $(this).fileinput({
            'uploadUrl': ctx + 'common/upload/hxkt',
            initialPreviewAsData: true,
            initialPreview: initialPreview,
            initialPreviewConfig: initialPreviewConfig,
            maxFileCount: 1,
        maxFileSize: 51200,
            autoReplace: true,
            overwriteInitial: true,
            allowedFileExtensions: ["pdf"],
            slugCallback: function(filename) {
                if ($("input[name='topName']").val()===""){
                    $(".file-uploadb").fileinput('clear');
                    $.modal.alertError("请先输入课题名称");
                    return false;
                }
                // 自定义文件名生成规则
                fileExtension = filename.split('.').pop();
                const year = new Date().getFullYear();
                const newName = year +"-"+ $("input[name='topName']").val() +"-"+ "结项备案表"+ "." + fileExtension;
                return newName;
            },
        }).on('fileuploaded', function (event, data, previewId, index) {
            if (data.response && data.response.url) {
                $("input[name='" + event.currentTarget.id + "']").val(data.response.url);
            }
        }).on('fileremoved', function (event, id, index) {
            $("input[name='" + event.currentTarget.id + "']").val('');
        }).on('fileclear', function (event) {
            $("input[name='" + event.currentTarget.id + "']").val('');
        });
    });
</script>
</body>
</html>